package com.stock.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stock.DO.Stock4EvrDayDomain;
import com.stock.DO.Stock4MinuteDomain;
import com.stock.DO.StockUpdownDomain;
import com.stock.api.StockControllerAPI;
import com.stock.entity.StockBlockRtInfo;
import com.stock.entity.StockBusiness;
import com.stock.enums.CodeEnum;
import com.stock.mapper.StockRtInfoMapper;
import com.stock.response.ResponseResult;
import com.stock.service.impl.StockServiceImpl;
import com.stock.vo.InnerMarketVO;
import com.stock.vo.PageResult;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/quot")
@EnableScheduling
public class StockController implements StockControllerAPI {
    @Autowired
    private StockServiceImpl stockService;
    @Autowired
    private StockRtInfoMapper stockRtInfoMapper;


    /**
     * 单个个股日K 数据查询 ，可以根据时间区间查询数日的K线数据
     * @param stockCode 股票编码
     */
    @RequestMapping("/stock/screen/dkline")
    @Override
    public ResponseResult<List<Stock4EvrDayDomain>> getDayKLinData(String stockCode) {
        return stockService.stockCreenDkLine(stockCode);
    }

    /**
     * 功能描述：查询单个个股的分时行情数据，也就是统计指定股票T日每分钟的交易数据；
     *         如果当前日期不在有效时间内，则以最近的一个股票交易时间作为查询时间点
     * @param code 股票编码
     * 查询个股的分时行情数据，也就是统计指定股票T日每分钟的交易数据；
     *      响应数据字段：日期 交易量 交易金额 最低价 最高价 前收盘价 公司名称 开盘价 股票code 当前价
     */
    @Override
    public ResponseResult<List<Stock4MinuteDomain>> stockScreenTimeSharing(@RequestParam("code") String code) {
        return stockService.stockScreenTimeSharing(code);
    }


    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内，则以最近的一个股票交易时间作为查询点
     * @return
     */
    @GetMapping("/stock/updown")
    @Scheduled(cron = "0 0/1 * * * ?")
    public ResponseResult<Map> getStockUpDown(){
        return stockService.stockUpDownScopeCount();
    }


    @Override
    @GetMapping(path = "/stock/tradevol")
    public ResponseResult<Map> stockTradeVol4InnerMarket() {
        return stockService.stockTradeVol4InnerMarket();
    }


    /**
     * 将指定页的股票数据导出到excel表下
     * @param response
     * @param page  当前页
     * @param pageSize 每页大小
     */
    @GetMapping("/stock/export")
    public void stockExport(HttpServletResponse response,@RequestParam("page") Integer page, @RequestParam("pageSize") Integer pageSize){
        stockService.stockExport(response,page,pageSize);
    }


    /**
     * 功能描述：沪深两市涨跌停分时行情数据查询，查询T日每分钟的涨跌停数据（T：当前股票交易日）
     * 		查询每分钟的涨停和跌停的数据的同级；
     * 		如果不在股票的交易日内，那么就统计最近的股票交易下的数据
     * 	 map:
     * 	    upList:涨停数据统计
     * 	    downList:跌停数据统计
     * @return
     */
    @Override
    @Scheduled(cron = "0 0/1 * * * ?")
    @GetMapping(path = "/stock/updown/count")//请求频率:每分钟
    public ResponseResult<Map> upDownCount() {
        return stockService.upDownCount();
    }

    @Override
    public ResponseResult<List<StockBusiness>> getStockBusiness() {
        List<StockBusiness> stockBusiness = stockService.getStockBusiness();
        return ResponseResult.ok(stockBusiness);
    }

    /**
     * 沪深两市个股涨幅分时行情数据查询，以时间顺序和涨幅查询前10条数据
     * @return
     */
    @GetMapping("/stock/increase")//请求频率:每分钟
    @Scheduled(cron = "0 0/1 * * * ?")
    public ResponseResult<List<StockUpdownDomain>> stockIncreaseLimit(){
        return stockService.stockIncreaseLimit();
    }

    @Override
    public ResponseResult<PageResult<StockUpdownDomain>> stockPage(@RequestParam("page") Integer page, @RequestParam("pageSize") Integer pageSize) {
        PageHelper.startPage(page, pageSize);
        List<StockUpdownDomain> infos= stockRtInfoMapper.stockAll();
        if (CollectionUtils.isEmpty(infos)) {
            return ResponseResult.error(CodeEnum.NO_RESPONSE_DATA);
        }
        PageInfo<StockUpdownDomain> listPageInfo = new PageInfo<StockUpdownDomain>(infos);
        PageResult<StockUpdownDomain> pageResult = new PageResult<>(listPageInfo);
        return ResponseResult.ok(pageResult);
    }

    /**
     * 获取国内最新大盘指数
     * @return
     */
    @GetMapping("/index/all")
    @Scheduled(cron = "0 0/1 * * * ?")
    public ResponseResult<List<InnerMarketVO>> innerIndexAll(){
        return ResponseResult.ok(stockService.innerIndexAll());
    }


    /**
     *需求说明: 沪深两市板块分时行情数据查询，以交易时间和交易总金额降序查询，取前10条数据
     * @return
     */
    @GetMapping("/sector/all")//请求频率:每分钟
    @Scheduled(cron = "0 0/1 * * * ?")
    public ResponseResult<List<StockBlockRtInfo>> sectorAll(){
        return stockService.sectorAllLimit();
    }
}